package com.platform.core.service;

import com.querydsl.core.types.Predicate;
import com.platform.comm.exceptions.RestApiException;
import com.platform.core.entity.SysRole;
import com.platform.dto.RoleQo;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.util.MultiValueMap;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Description: 角色-Service接口
 *
 * @author libin
 * Created on 2019/4/21
 **/
public interface SysRoleService extends BaseEntityBiz<SysRole> {
    String DEFAULT_ROLE = "ROLE_USER";
    /**
     * 创建
     *
     * @param roleQo 角色对象
     * @return RoleQo
     */
    RoleQo create(RoleQo roleQo);

    /**
     * 修改
     *
     * @param roleQo 角色对象
     * @return RoleQo
     */
    RoleQo modify(RoleQo roleQo);

    /**
     * 分页查询
     *
     * @param predicate  查询条件
     * @param pageable   分页参数
     * @param parameters 查询参数
     * @return 列表
     */
    Page<RoleQo> queryRoles(Predicate predicate, Pageable pageable, MultiValueMap<String, String> parameters);

    /**
     * 检查角色编码是否存在
     *
     * @param id ID (修改时用)
     * @param code 角色编码
     * @return 数目
     */
    boolean checkCodeExists(String id, String code);

    /**
     * 检查角色编码是否存在
     *
     * @param id ID(修改时用)
     * @param roleName 角色名
     * @return 数目
     */
    boolean checkNameExists(String id, String roleName);

    /**
     * 根据编码查询角色信息
     *
     * @param code 角色编码
     * @return SysRoleDto
     */
    SysRole findByCode(String code);

    /**
     * 根据编码查询角色信息
     *
     * @param code 角色编码
     * @return SysRoleDto
     */
    SysRole findByCodeNoException(String code);

    /**
     * 物理删除
     * @param id 角色Id
     */
    default void delete(String id) {
        throw new RestApiException("未实现具体业务");
    }

    /**
     * 根据角色Id查询角色信息
     * @param roleId 角色Id
     * @return 角色信息
     */
    RoleQo getByRoleId(String roleId);

    /**
     * 根据角色Id查询角色信息
     * @param roleIds 角色Id
     * @return 角色信息
     */
    List<RoleQo> getByRoleId(List<String> roleIds);

    /**
     * 根据部门查询可用的角色
     * @param departId 部门id
     * @return 角色集合
     */
    List<RoleQo> queryValidRoles(String departId);

    /**
     * 获取当前用户所拥有的角色
     * @return 角色集合
     */
    Set<String> roles();

    /**
     * 同步角色到子系统
     * @param id 角色id
     */
    void syncSubsystem(String id);

    /**
     * 角色启用禁用
     * @param id 角色id
     * @param isEnable 状态
     */
    void changeStatus(String id, String isEnable);

    /**
     *  根据前缀查询角色,主要为了适配不同的应用分配的角色
     *  约定: 按照应用编码前缀来约定
     * @param parametersMap 参数
     * @return 匹配的角色列表
     */
    List<RoleQo> queryRoleByPrefix(Map<String, String> parametersMap);
}
